package com.skyd.core.game.td;

import java.util.concurrent.CopyOnWriteArrayList;

import com.skyd.core.vector.Vector2DF;

public class TDBullet extends TDActor implements ITDBullet {

	@Override
	public Vector2DF getSize() {
		return new Vector2DF();
	}

	@Override
	public void update() {
		move();
	}

	/**
	 * 移动
	 */
	protected void move() {
		if(getIsFailure())return;
		Vector2DF p = getPosition();
		Vector2DF t = getTarget().getPosition();
		float d = t.minusNew(p).getAngle();
		setPosition(p.plusNew(new Vector2DF(getSpeed(), 0).setAngle(d)));
		if (p.minusNew(t).getLength() <= getSpeed()) {
			toAttack();
		} else {
			if (d < 0)
				setDirection(360 - d * -1);
			else
				setDirection(d);
		}
	}
	
	/**
	 * 进行攻击
	 */
	protected void toAttack(){
		attack();
		setIsFailure(true);
		onFailure();
		TDWorld.getInstance().getBullets().remove(this);
	}

	/**
	 * 攻击
	 * 
	 */
	protected void attack() {
		getTarget().OnUnderAttack(getSource(),
				getSource().getFinalStatus().getATK());
	}

	/**
	 * 初始值为null。 功能注释：来源
	 */
	private TDActor _Source = null;

	/**
	 * 获取Source。 功能注释：来源
	 * 
	 * @return 当前的ITDActor类型的值
	 */
	public TDActor getSource() {
		return _Source;
	}

	/**
	 * 设置Source。 功能注释：来源
	 * 
	 * @param value
	 *            要设置的ITDActor类型值
	 */
	public void setSource(TDActor value) {
		_Source = value;
	}

	/**
	 * 设置Source为其默认值(null)。 功能注释：来源
	 */
	public void setSourceToDefault() {
		setSource(null);
	}

	/**
	 * 初始值为null。 功能注释：目标
	 */
	private TDActor _Target = null;

	/**
	 * 获取Target。 功能注释：目标
	 * 
	 * @return 当前的ITDActor类型的值
	 */
	public TDActor getTarget() {
		return _Target;
	}

	/**
	 * 设置Target。 功能注释：目标
	 * 
	 * @param value
	 *            要设置的ITDActor类型值
	 */
	public void setTarget(TDActor value) {
		_Target = value;
	}

	/**
	 * 设置Target为其默认值(null)。 功能注释：目标
	 */
	public void setTargetToDefault() {
		setTarget(null);
	}

	/**
	 * 初始值为false。 功能注释：是否已失效
	 */
	private boolean _IsFailure = false;

	/**
	 * 获取IsFailure。 功能注释：是否已失效
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsFailure() {
		return _IsFailure;
	}

	/**
	 * 设置IsFailure。 功能注释：是否已失效
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsFailure(boolean value) {
		_IsFailure = value;
	}

	/**
	 * 设置IsFailure为其默认值(false)。 功能注释：是否已失效
	 */
	public void setIsFailureToDefault() {
		setIsFailure(false);
	}
	
	/**
	* FailureListener事件监听器列表。子弹失效
	*/
	private  CopyOnWriteArrayList<ITDBulletFailureListener>  _FailureListenerList = null;
	
	/**
	 * 增加一个FailureListener事件的监听器，返回是否成功增加。事件功能注释：子弹失效
	 * @param listener FailureListener事件监听器对象
	 * @return 是否成功增加。如果该监听器对象已存在，则返回false。
	 */
	public  boolean addOnFailureListener(ITDBulletFailureListener listener)
	{
		if(_FailureListenerList==null)_FailureListenerList=new CopyOnWriteArrayList<ITDBulletFailureListener>();
		else if(_FailureListenerList.contains(listener))return false;
		_FailureListenerList.add(listener);
		return true;
	}
	
	/**
	 * 移除一个FailureListener事件的监听器，返回是否成移除。事件功能注释：子弹失效
	 * @param listener FailureListener事件监听器对象
	 * @return 是否成功移除。如果该监听器对象不存在，则返回false。
	 */
	public  boolean removeOnFailureListener(ITDBulletFailureListener listener)
	{
		if(_FailureListenerList==null||!_FailureListenerList.contains(listener))return false;
		_FailureListenerList.remove(listener);
		return true;
	}
	
	/**
	 * 清空所有FailureListener事件的监听器。事件功能注释：子弹失效
	 */
	public  void clearOnFailureListeners()
	{
		if(_FailureListenerList!=null)_FailureListenerList.clear();
	}
	
	/**
	 * 子弹失效
	 */
	protected  void onFailure()
	{
		if(_FailureListenerList!=null)
			for(ITDBulletFailureListener listener:_FailureListenerList){
				listener.onFailure(this);
			}
	}
}
